/*
 * UMediaFileConverter.h
 *
 *  Created on: 2023年7月12日
 *      Author: terry
 */

#ifndef UMEDIAFILECONVERTER_H_
#define UMEDIAFILECONVERTER_H_

#include "UMediaFormat.h"


enum UMediaFileConverterState
{
	UMEDIA_CONVERTER_CLOSED = 0,	/// 关闭, 未打开
	UMEDIA_CONVERTER_OPENING,		/// 打开中
	UMEDIA_CONVERTER_OPENED,		/// 已经打开
	UMEDIA_CONVERTER_CONVERTING,	/// 转换中
	UMEDIA_CONVERTER_END,			/// 转换结束
	UMEDIA_CONVERTER_ERROR,			/// 出错
};


class UMediaFileConverter;


/// 转换回调
class UMediaFileConverterSink
{
public:
	virtual ~UMediaFileConverterSink() {}

	/**
	 * 转换通知
	 * 转换过程中, 大约每1%会触发一次通知
	 * @param converter	转换器
	 * @param state     转换状态, @see UMediaFileConverterState
	 * @param time		当前媒体时间
	 * @param percent	百分数, 取值[0,1.0]
	 */
	virtual void onConvert(UMediaFileConverter* converter, int state, int64_t time, double percent) =0;

};


class DLLEXPORT UMediaFileConverter
{
public:

public:
	virtual ~UMediaFileConverter() {}

	/**
	 * 打开
	 * @param inputPath	输入文件路径
	 * @param outputPath	输出文件路径
	 * @return 0 表示成功
	 */
	virtual int open(const char* inputPath, const char* outputPath) =0;

	/**
	 * 关闭
	 */
	virtual void close() =0;

	/**
	 * 是否打开
	 * @return
	 */
	virtual bool isOpen() =0;

	/**
	 * 获取输入的媒体格式
	 * @param fmt
	 * @return
	 */
	virtual bool getFormat(UMediaFormat& fmt) =0;

	/**
	 * 获取输入的媒体时长
	 * 单位为毫秒
	 * @return
	 */
	virtual int getDuration() =0;

	/**
	 * 开始转换
	 * @return
	 */
	virtual int start() =0;

	/**
	 * 停止转换
	 */
	virtual void stop() =0;

	/**
	 * 获取转换状态 @see UMediaFileConverterState
	 * @return
	 */
	virtual int getState() =0;

	/**
	 * 获取输入文件路径
	 * @return
	 */
	virtual const char* getInput() =0;

	/**
	 * 获取输出文件路径
	 * @return
	 */
	virtual const char* getOutput() =0;

	/**
	 * 获取当前媒体时间
	 * @return
	 */
	virtual int64_t getTime() =0;

	/**
	 * 获取当前转换进度
	 * @return
	 */
	virtual double getPos() =0;

	/**
	 * 设置回调
	 * 在Open之前调用
	 * @param sink
	 */
	virtual void setSink(UMediaFileConverterSink* sink) =0;

	/**
	 * 设置转码任务id
	 */
	virtual int64_t setId(int64_t id) =0;

	/**
	 * 获取转码任务id
	 */
	virtual int64_t getId() =0;

	/**
	 * 获取开始时间, EPOCH 毫秒
	 */
	virtual int64_t getStartTime() = 0;

	/**
	 * 获取转码持续时间, 单位位毫秒
	 */
	virtual int64_t getConvertElapse() = 0;

	virtual int64_t getConvertDuration() = 0;

};


class DLLEXPORT UMediaFileConvService
{
public:
	enum Mode
	{
		MODE_ON_DEMAND = 0,	/// 按需启动线程.
		MODE_ALWAYS = 1		/// 服务线程始终运行.
	};

public:
	virtual ~UMediaFileConvService() {}

	virtual bool open(int mode, UMediaFileConverterSink* sink) =0;

	virtual void close() =0;

	virtual bool isOpen() =0;

	virtual bool add(const char* inputPath, const char* outputPath, int64_t id) =0;

	virtual bool remove(const char* inputPath) =0;

	virtual void removeAll() =0;

	virtual size_t size() = 0;


};


class DLLEXPORT UMediaFileConverterFactory
{
public:
	static void startup();
	static void cleanup();

	/**
	 * 创建转换器
	 * @param fileFormat	输出文件格式
	 * @return
	 */
	static UMediaFileConverter* create(const char* fileFormat);

	/**
	 * 销毁转换器
	 * @param writer
	 */
	static void destroy(UMediaFileConverter* writer);


	UMediaFileConverterFactory()
	{
		UMediaFileConverterFactory::startup();
	}

	~UMediaFileConverterFactory()
	{
		UMediaFileConverterFactory::cleanup();
	}


	static UMediaFileConvService* createService();

	static void destroyService(UMediaFileConvService* svc);


};



#endif /* UMEDIAFILECONVERTER_H_ */
